package com.ruoyi.sms.strategy.impl;

import com.alibaba.fastjson.JSON;
import com.aliyuncs.*;
import com.aliyuncs.dysmsapi.model.v20170525.SendBatchSmsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.SendBatchSmsResponse;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.google.gson.Gson;
import com.ruoyi.sms.enums.SendProvider;
import com.ruoyi.sms.entity.SendReq;
import com.ruoyi.sms.entity.SmsResponse;
import com.ruoyi.sms.strategy.SendStrategyContent;
import org.springframework.stereotype.Component;

import org.apache.commons.lang3.StringUtils;

/**
 * 阿里短信服务策略
 * 在这里编写相关业务
 */
@Component
public class AliSmsStrategy extends SendStrategyContent {
    // 设置公共请求参数，初始化Client。
    private DefaultProfile profile = DefaultProfile.getProfile(
            "cn-shenzhen",// API支持的地域ID，如短信API的值为：cn-hangzhou。
            "LTAI5tKcPmVF74TERe58ioeG",// 您的AccessKey ID。
            "x4c3LHfHdDduQwQk2mT2Woj1kGkMb9");// 您的AccessKey Secret。
    private IAcsClient client = new DefaultAcsClient(profile);

    @Override
    public SmsResponse toSend(SendReq sendReq) {
        if ("0".equals(sendReq.getSmType())){ // 非模板短信
            return SmsResponse.error("方法没有完成！");
        }else if ("1".equals(sendReq.getSmType())){ // 模板短信
            //组装请求对象-具体描述见控制台-文档部分内容
            SendSmsRequest request = new SendSmsRequest();
            //必填:待发送手机号
            request.setPhoneNumbers(sendReq.getPhoneNumberList().get(0));
            //必填:短信签名-可在短信控制台中找到
            request.setSignName(sendReq.getSignNameList().get(0));
            //必填:短信模板-可在短信控制台中找到
            request.setTemplateCode(sendReq.getTemplateCode());
            //可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
            request.setTemplateParam(JSON.toJSON(sendReq.getTemplateParamList().get(0)).toString());
            //选填-上行短信扩展码(无特殊需求用户请忽略此字段)如果需要查看短信回复。这个得填上
//            request.setSmsUpExtendCode("90997");
            //可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
//            request.setOutId("yourOutId");
            //hint 此处可能会抛出异常，注意catch
            SendSmsResponse sendSmsResponse = null;
            try {
                sendSmsResponse = client.getAcsResponse(request);
            } catch (ClientException e) {
                e.printStackTrace();
            }
            System.err.println("短信接口返回的数据----------------");
            System.err.println("Code=" + sendSmsResponse.getCode());
            System.err.println("Message=" + sendSmsResponse.getMessage());
            System.err.println("RequestId=" + sendSmsResponse.getRequestId());
            System.err.println("BizId=" + sendSmsResponse.getBizId());
            if(sendSmsResponse.getCode() != null && "OK".equals(sendSmsResponse.getCode())) {
                //请求成功，返回回执id，通过回执id和手机号，可查询短信详情
                return SmsResponse.success()
                        .data("code", sendSmsResponse.getCode())
                        .data("bizId", sendSmsResponse.getBizId())
                        .data("message", sendSmsResponse.getMessage())
                        .data("requestId", sendSmsResponse.getRequestId());

            }
            return SmsResponse.error()
                    .data("code", sendSmsResponse.getCode())
                    .data("bizId", sendSmsResponse.getBizId())
                    .data("message", sendSmsResponse.getMessage())
                    .data("requestId", sendSmsResponse.getRequestId());
        }
        return SmsResponse.error("请选择短信类型！");
    }

    @Override
    public SmsResponse toSendBatch(SendReq sendReq) {
        if ("0".equals(sendReq.getSmType()) || StringUtils.isEmpty(sendReq.getTemplateCode())){ // 非模板短信
            return SmsResponse.error("方法没有完成！");
        }
        if ("1".equals(sendReq.getSmType()) || !StringUtils.isEmpty(sendReq.getTemplateCode())){ // 模板短信
            if (!(sendReq.getPhoneNumberList().size() == sendReq.getSignNameList().size() && sendReq.getSignNameList().size() == sendReq.getTemplateParamList().size())){
                return SmsResponse.error("短信的发送人列表，签名列表，参数列表个数不匹配！");
            }
            //组装请求对象
            SendBatchSmsRequest request = new SendBatchSmsRequest();
            //使用post提交
            request.setMethod(MethodType.POST);
            //必填:待发送手机号。支持JSON格式的批量调用，批量上限为100个手机号码,批量调用相对于单条调用及时性稍有延迟,验证码类型的短信推荐使用单条调用的方式
            request.setPhoneNumberJson(JSON.toJSON(sendReq.getPhoneNumberList()).toString());
            //必填:短信签名-支持不同的号码发送不同的短信签名
            request.setSignNameJson(JSON.toJSON(sendReq.getSignNameList()).toString());
            //必填:短信模板-可在短信控制台中找到
            request.setTemplateCode(sendReq.getTemplateCode());
            //必填:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
            //友情提示:如果JSON中需要带换行符,请参照标准的JSON协议对换行符的要求,比如短信内容中包含\r\n的情况在JSON中需要表示成\\r\\n,否则会导致JSON在服务端解析失败
            request.setTemplateParamJson(JSON.toJSON(sendReq.getTemplateParamList()).toString());
            //可选-上行短信扩展码(扩展码字段控制在7位或以下，无特殊需求用户请忽略此字段)
            //request.setSmsUpExtendCodeJson("[\"90997\",\"90998\"]");
            //请求失败这里会抛ClientException异常
            SendBatchSmsResponse sendSmsResponse = null;
            try {
                sendSmsResponse = client.getAcsResponse(request);
            } catch (ClientException e) {
                e.printStackTrace();
            }
            System.err.println("短信接口返回的数据----------------");
            System.err.println("Code=" + sendSmsResponse.getCode());
            System.err.println("Message=" + sendSmsResponse.getMessage());
            System.err.println("RequestId=" + sendSmsResponse.getRequestId());
            System.err.println("BizId=" + sendSmsResponse.getBizId());
            if(sendSmsResponse.getCode() != null && "OK".equals(sendSmsResponse.getCode())) {
                //请求成功，返回回执id，通过回执id和手机号，可查询短信详情
                return SmsResponse.success()
                        .data("code", sendSmsResponse.getCode())
                        .data("bizId", sendSmsResponse.getBizId())
                        .data("message", sendSmsResponse.getMessage())
                        .data("requestId", sendSmsResponse.getRequestId());
            }
            return SmsResponse.error()
                    .data("code", sendSmsResponse.getCode())
                    .data("bizId", sendSmsResponse.getBizId())
                    .data("message", sendSmsResponse.getMessage())
                    .data("requestId", sendSmsResponse.getRequestId());
        }
        return SmsResponse.error("请选择发送短信的类型！");
    }

    @Override
    public SmsResponse getInfo(SendReq sendReq) {
        return SmsResponse.error("方法没有完成！");
    }

    @Override
    public Integer channelInit() {
        return SendProvider.ALI_SMS.getCode();
    }
}
